package com.test.jdk8.demo2;

import com.sun.org.apache.xerces.internal.impl.xpath.regex.Match;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * @ClassName Lambda7
 * @Description TODO
 * @Author 维康
 * @Date 2018/7/10 11:09
 * @Version 1.0
 **/
public class Lambda7 {

    public static void main(String[] args){

        /**
         * stream的其他应用：
         1、count()、max()、min()方法
         */
        List<Integer> collection = new ArrayList<Integer>();
        collection.add(14);
        collection.add(5);
        collection.add(43);
        collection.add(89);
        collection.add(64);
        collection.add(112);
        collection.add(55);
        collection.add(55);
        collection.add(58);
        //list长度
        System.out.println(collection.parallelStream().count());

        //求最大值,返回Option,通过Option.get()获取值
        System.out.println(collection.parallelStream().max((a,b)->{return a-b;}).get());

        //求最小值,返回Option,通过Option.get()获取值
        System.out.println(collection.parallelStream().min((a,b)->{return a-b;}).get());


        /**
         * Filter 过滤方法
         * 过滤通过一个predicate接口来过滤并只保留符合条件的元素，该操作属于中间操作。
         */
        List<Integer> collection2 = new ArrayList<Integer>();
        collection2.add(14);
        collection2.add(5);
        collection2.add(43);
        collection2.add(89);
        collection2.add(64);
        collection2.add(112);
        collection2.add(55);
        collection2.add(55);
        collection2.add(58);
        Long count = collection2.stream().filter(num -> num!=null).
                filter(num -> num.intValue()>50).count();
        System.out.println(count);


        /**
         * 3、distinct方法
         去除重复
         */
        List<Integer> collection3 = new ArrayList<Integer>();
        collection3.add(14);
        collection3.add(5);
        collection3.add(43);
        collection3.add(89);
        collection3.add(64);
        collection3.add(112);
        collection3.add(55);
        collection3.add(55);
        collection3.add(58);
        collection3.stream().distinct().sorted().forEach(obj -> System.out.print(obj+","));


       /* 4、Sort 排序
            排序是一个中间操作，返回的是排序好后的Stream。
            如果你不指定一个自定义的Comparator则会使用默认排序。
        */
        System.out.println("");
       List<String> sortList = new ArrayList<>();
        sortList.add("add");
        sortList.add("adobe");
        sortList.add("boll");
        sortList.add("kill");
        sortList.stream().sorted().filter((s) -> s.startsWith("a")).forEach(System.out::println);


        /**
         * 5、Map 映射
         对于Stream中包含的元素使用给定的转换函数进行转换操作，新生成的Stream只包含转换生成的元素。
         这个方法有三个对于原始类型的变种方法，分别是：mapToInt，mapToLong和mapToDouble。
         这三个方法也比较好理解，比如mapToInt就是把原始Stream转换成一个新的Stream，
         这个新生成的Stream中的元素都是int类型。
         之所以会有这样三个变种方法，可以免除自动装箱/拆箱的额外消耗；
         */
        List<String> collection5 = new ArrayList<String>();
        collection5.add("14");
        collection5.add("5");
        collection5.add("43");
        collection5.add("89");
        collection5.add("64");
        collection5.add("112");
        collection5.add("55");
        collection5.add("55");
        collection5.add("58");
        //将String转化为Integer类型
        collection5.stream().mapToInt(Integer::valueOf).forEach(System.out::println);
        //或
        collection5.stream().mapToInt(a->Integer.parseInt(a)).forEach(System.out::println);

        /*

        7、limit：
        对一个Stream进行截断操作，获取其前N个元素，如果原Stream中包含的元素个数小于N，那就获取其所有的元素；
        */
        /*
        8、skip：
        返回一个丢弃原Stream的前N个元素后剩下元素组成的新Stream，如果原Stream中包含的元素个数小于N，那么返回空Stream；
        */
        /*
        9、Match 匹配
        Stream提供了多种匹配操作，允许检测指定的Predicate是否匹配整个Stream。所有的匹配操作都是最终操作，并返回一个boolean类型的值。
        */

    }

}
